const Koa = require('koa');
const Router = require('koa-router');
const { PassThrough } = require('stream');
const cors = require('koa-cors')
const app = new Koa();
const router = new Router();

// 发送消息
const sendMessage = async (stream) => {
   
    
    const data = [
        '现在科学技术的发展速度叫人惊叹',
        '同样在数码相机的技术创新上',
        '随着数码相机越来越普及',
        '数码相机现已成为大家生活中不可缺少的电子产品',
        '而正是因为这样，技术的创新也显得尤为重要',
        '现在科学技术的发展速度叫人惊叹',
        '同样在数码相机的技术创新上',
        '随着数码相机越来越普及',
        '数码相机现已成为大家生活中不可缺少的电子产品',
        '而正是因为这样，技术的创新也显得尤为重要',
        '现在科学技术的发展速度叫人惊叹',
        '同样在数码相机的技术创新上',
        '随着数码相机越来越普及',
        '数码相机现已成为大家生活中不可缺少的电子产品',
        '而正是因为这样，技术的创新也显得尤为重要',
        '现在科学技术的发展速度叫人惊叹',
        '同样在数码相机的技术创新上',
        '随着数码相机越来越普及',
        '数码相机现已成为大家生活中不可缺少的电子产品',
        '而正是因为这样，技术的创新也显得尤为重要',
        '现在科学技术的发展速度叫人惊叹',
        '同样在数码相机的技术创新上',
        '随着数码相机越来越普及',
        '数码相机现已成为大家生活中不可缺少的电子产品',
        '而正是因为这样，技术的创新也显得尤为重要',
        '现在科学技术的发展速度叫人惊叹',
        '同样在数码相机的技术创新上',
        '随着数码相机越来越普及',
        '数码相机现已成为大家生活中不可缺少的电子产品',
        '而正是因为这样，技术的创新也显得尤为重要',
    ];

    // 循环上面数组: 推送数据、休眠 2 秒
    for (const value of data) {
        stream.write(`data: ${value}\n\n`); // 写入数据(推送数据)
        await new Promise((resolve) => setTimeout(resolve, 100));
    }

    // 结束流
    stream.end();
};

router.get('/sse', async (ctx) => {
    console.log('访问了');
    // 1. 设置响应头
    ctx.set({
        'Connection': 'keep-alive',
        'Cache-Control': 'no-cache',
        'Content-Type': 'text/event-stream', // 表示返回数据是个 stream
    });

    // 2. 创建流、并作为接口数据进行返回
    const stream = new PassThrough();
    ctx.body = stream;
    ctx.status = 200;
    // 3. 推送流数据
    sendMessage(stream, ctx);
});

app.use(cors({
    // origin: 'http://example.com', // 允许的源
    methods: ['GET', 'POST'], // 允许的 HTTP 方法
    allowedHeaders: ['Content-Type', 'Authorization'], // 允许的请求头
}));
app.use(router.routes()).use(router.allowedMethods());

const port = 3000;
app.listen(port, () => {
    console.log(`Server is running on http://localhost:${port}`);
});